import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 吨/千吨转换验证测试
 * 详细验证转换逻辑的正确性
 */
public class TonKilotonConversionVerification {
    
    public static void main(String[] args) {
        System.out.println("=== 吨/千吨转换逻辑验证 ===");
        
        // 测试边界值
        testBoundaryValues();
        
        // 测试典型值
        testTypicalValues();
        
        // 测试四舍五入
        testRoundingCases();
        
        // 验证您提供的数据
        testYourData();
    }
    
    /**
     * 测试边界值
     */
    private static void testBoundaryValues() {
        System.out.println("\n--- 边界值测试 ---");
        
        // 小于1000的边界值
        testConversion("999.99", "999.99吨");
        testConversion("999.994", "999.99吨");  // 四舍五入后仍小于1000
        testConversion("999.995", "1000.00吨"); // 四舍五入后等于1000，但仍显示为吨
        testConversion("999.996", "1000.00吨"); // 四舍五入后等于1000，但仍显示为吨
        
        // 等于1000的值
        testConversion("1000", "1.00千吨");
        testConversion("1000.00", "1.00千吨");
        testConversion("1000.004", "1.00千吨"); // 四舍五入后为1000
        testConversion("1000.005", "1.00千吨"); // 四舍五入后为1000
        
        // 大于1000的值
        testConversion("1000.01", "1.00千吨");
        testConversion("1001", "1.00千吨");
        testConversion("1500", "1.50千吨");
    }
    
    /**
     * 测试典型值
     */
    private static void testTypicalValues() {
        System.out.println("\n--- 典型值测试 ---");
        
        // 小数值
        testConversion("0.5", "0.50吨");
        testConversion("1.23", "1.23吨");
        testConversion("10.567", "10.57吨");
        
        // 中等数值
        testConversion("100.89", "100.89吨");
        testConversion("672.669", "672.67吨");
        testConversion("500.123", "500.12吨");
        
        // 大数值（千吨）
        testConversion("1200.5", "1.20千吨");
        testConversion("2345.67", "2.35千吨");
        testConversion("12000", "12.00千吨");
        testConversion("1234567", "1234.57千吨");
    }
    
    /**
     * 测试四舍五入情况
     */
    private static void testRoundingCases() {
        System.out.println("\n--- 四舍五入测试 ---");
        
        // 吨的四舍五入
        testConversion("1.234", "1.23吨");   // 舍
        testConversion("1.235", "1.24吨");   // 入
        testConversion("1.236", "1.24吨");   // 入
        
        // 千吨的四舍五入
        testConversion("1234.5", "1.23千吨");  // 舍
        testConversion("1235.5", "1.24千吨");  // 入
        testConversion("1236.7", "1.24千吨");  // 入
        
        // 边界四舍五入
        testConversion("999.994", "999.99吨");  // 舍，仍为吨
        testConversion("999.995", "1000.00吨"); // 入，但仍为吨（因为等于1000）
        testConversion("1000.004", "1.00千吨"); // 舍，为千吨
        testConversion("1000.005", "1.00千吨"); // 入，为千吨
    }
    
    /**
     * 验证您提供的数据
     */
    private static void testYourData() {
        System.out.println("\n--- 您的数据验证 ---");
        
        // 根据您之前提到的数据
        testConversion("672.669", "672.67吨");   // 纸品类
        testConversion("0.686", "0.69吨");       // 旧衣类
        testConversion("0.037", "0.04吨");       // 塑料类
        testConversion("0.000119", "0.00吨");    // 贵重金属
        
        // 假设的大数值
        testConversion("1200.669", "1.20千吨");  // 如果纸品类更大
        testConversion("2500.123", "2.50千吨");  // 大型废料
    }
    
    /**
     * 测试单个转换
     */
    private static void testConversion(String inputStr, String expected) {
        BigDecimal input = new BigDecimal(inputStr);
        String result = formatWeightValue(input);
        String status = result.equals(expected) ? "✓" : "✗";
        System.out.println(status + " " + inputStr + " -> \"" + result + "\" (期望: \"" + expected + "\")");
        
        if (!result.equals(expected)) {
            System.out.println("    ❌ 转换错误！实际: \"" + result + "\", 期望: \"" + expected + "\"");
        }
    }
    
    /**
     * 格式化重量值（与实际代码逻辑一致）
     */
    private static String formatWeightValue(BigDecimal value) {
        if (value == null) {
            value = BigDecimal.ZERO;
        }
        
        // 保留2位小数
        BigDecimal formattedWeight = value.setScale(2, RoundingMode.HALF_UP);
        
        // 如果大于等于1000吨，转换为千吨
        if (formattedWeight.compareTo(new BigDecimal("1000")) >= 0) {
            BigDecimal weightInKiloTons = formattedWeight.divide(new BigDecimal("1000"), 2, RoundingMode.HALF_UP);
            return weightInKiloTons.toString() + "千吨";
        } else {
            return formattedWeight.toString() + "吨";
        }
    }
    
    /**
     * 显示转换规则说明
     */
    static {
        System.out.println("转换规则说明：");
        System.out.println("1. 先将原始值四舍五入到2位小数");
        System.out.println("2. 如果结果 >= 1000，则除以1000并添加'千吨'");
        System.out.println("3. 如果结果 < 1000，则直接添加'吨'");
        System.out.println("4. 千吨的值也保留2位小数");
        System.out.println("5. 关键边界：999.995会四舍五入为1000.00，但仍显示为'1000.00吨'");
        System.out.println("6. 只有原始四舍五入后的值 >= 1000 才转换为千吨");
    }
}
